/*
 * Pessoa.java
 *
 * Created on 14 de Maio de 2007, 17:59
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package pt.iscte.dcti.es.rhplus.utilizador;

import java.util.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Hashtable;

import java.util.LinkedList;
import pt.iscte.dcti.es.rhplus.sistema.CodigoPostal;
import pt.iscte.dcti.es.rhplus.sistema.UtensiliosParaDatas;
import pt.iscte.dcti.es.rhplus.sistema.persistencia.AcessoBD;

/**
 *
 * @author Gustavo Cabral
 * @author Helena Monteiro
 * @author Joao Catarino
 * @author Tiago Moreiras
 */
public abstract class Pessoa {

    /** Creates a new instance of Pessoa */
    public Pessoa(final int id_pessoa, final String nome, final char sexo, final int bi,
            final Date data_de_nascimento, final int nif, final String email, final int telefone,
            final int telemovel, final String morada, final String grupo_sanguineo, final CodigoPostal codigo_postal) {

        this.id_pessoa = id_pessoa;
        this.nome = nome;
        this.sexo = sexo;
        this.bi = bi;
        this.data_de_nascimento = data_de_nascimento;
        this.nif = nif;
        this.email = email;
        this.telefone = telefone;
        this.telemovel = telemovel;
        this.morada = morada;
        this.grupo_sanguineo = grupo_sanguineo;
        this.codigo_postal = codigo_postal;
    }

    public static boolean temContaDeUtilzador(int id_pessoa) throws SQLException, SQLException, ClassNotFoundException, ClassNotFoundException, InstantiationException, InstantiationException, IllegalAccessException {
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        Hashtable<String, Object> dados = new Hashtable<String, Object>();
        dados.put("var_id_pessoa", new Integer(id_pessoa));
        String qryName = new String("verifica_pessoa_tem_conta_de_utilizador");
        ResultSet result_set = acesso_bd.executaSelect(qryName, dados);
        boolean existe = result_set.next();
        acesso_bd.fechaLigacao();
        return existe;
    }

    public static LinkedList devolveIdPessoaPorBI(String BI) throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException {
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("devolver_idPessoa_por_bi");
        Hashtable<String, Object> dados = new Hashtable<String, Object>();
        dados.put("var_bi", new Integer(BI));
        ResultSet result_set = acesso_bd.executaSelect(qryName, dados);
                
        LinkedList lista = new LinkedList();
        if (result_set.next()) {
            int id_pessoa = result_set.getInt("id_pessoa");
            Date data_nascimento = result_set.getDate("data_de_nascimento");
            lista.add(id_pessoa);
            lista.add(data_nascimento);
        }
        acesso_bd.fechaLigacao();

        return lista;
    }

    public int getIdPessoa() {
        return id_pessoa;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(final String nome) {
        this.nome = nome;
    }

    public char getSexo() {
        return sexo;
    }

    public void setSexo(final char sexo) {
        this.sexo = sexo;
    }

    public int getBI() {
        return bi;
    }

    public void setBI(final int bi) {
        this.bi = bi;
    }

    public Date getDataDeNascimento() {
        return data_de_nascimento;
    }

    public void setDataDeNascimento(final Date data_de_nascimento) {
        this.data_de_nascimento = data_de_nascimento;
    }

    public int getNIF() {
        return nif;
    }

    public void setNIF(final int nif) {
        this.nif = nif;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(final String email) {
        this.email = email;
    }

    public int getTelefone() {
        return telefone;
    }

    public void setTelefone(final int telefone) {
        this.telefone = telefone;
    }

    public int getTelemovel() {
        return telemovel;
    }

    public void setTelemovel(final int telemovel) {
        this.telemovel = telemovel;
    }

    public String getMorada() {
        return morada;
    }

    public void setMorada(final String morada) {
        this.morada = morada;
    }

    public String getGrupoSanguineo() {
        return grupo_sanguineo;
    }

    public void setGrupoSanguineo(final String grupo_sanguineo) {
        this.grupo_sanguineo = grupo_sanguineo;
    }

    public CodigoPostal getCodigoPostal() {
        return codigo_postal;
    }

    public void setCodigoPostal(final CodigoPostal codigo_postal) {
        this.codigo_postal = codigo_postal;
    }

    public static void insere(final Hashtable<String, Object> dados_da_pessoa)
            throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {

        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("inserir_pessoa");
        acesso_bd.executaUpdate(qryName, dados_da_pessoa);
        acesso_bd.fechaLigacao();

    }

    public static void altera(final Hashtable<String, Object> dados_da_pessoa)
            throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {

        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("alterar_pessoa");
        acesso_bd.executaUpdate(qryName, dados_da_pessoa);
        acesso_bd.fechaLigacao();

    }

    public static void remove(final int id_pessoa)
            throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {

        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("remover_pessoa");
        Hashtable<String, Object> dados_da_pessoa = new Hashtable<String, Object>();
        dados_da_pessoa.put("var_id_pessoa", new Integer(id_pessoa));

        acesso_bd.executaUpdate(qryName, dados_da_pessoa);
        acesso_bd.fechaLigacao();

    }

    public static int devolveUltimoIdentificadorDeInsercao()
            throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("devolver_ultimo_id_de_pessoa");
        ResultSet result_set = acesso_bd.executaSelect(qryName, null);
        result_set.next();
        int ultimo_id_pessoa = result_set.getInt("ultimo_id");
        acesso_bd.fechaLigacao();
        return ultimo_id_pessoa;
    }

    public Hashtable<String, Object> toHashtable() {

        Hashtable<String, Object> dados_pessoa = new Hashtable<String, Object>();

        dados_pessoa.put("var_id_pessoa", new Integer(this.getIdPessoa()));
        dados_pessoa.put("var_nome", this.getNome());
        dados_pessoa.put("var_sexo", this.getSexo());
        dados_pessoa.put("var_bi", new Integer(this.getBI()));
        dados_pessoa.put("var_data_de_nascimento", UtensiliosParaDatas.converteParaString(this.getDataDeNascimento()));
        dados_pessoa.put("var_nif", this.getNIF());
        dados_pessoa.put("var_email", this.getEmail());
        dados_pessoa.put("var_telefone", new Integer(this.getTelefone()));
        dados_pessoa.put("var_telemovel", new Integer(this.getTelemovel()));
        dados_pessoa.put("var_morada", this.getMorada());
        dados_pessoa.put("var_grupo_sanguineo", this.getGrupoSanguineo());
        dados_pessoa.put("var_id_codigo_postal", this.getCodigoPostal().getIdCodigoPostal());

        return dados_pessoa;
    }

    public void gravaParaBaseDeDados()
            throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        Pessoa.altera(this.toHashtable());
    }

    public String toString() {
        return id_pessoa + ";" + nome + ";" + sexo + ";" + bi + ";" + data_de_nascimento + ";" + nif + ";" + email + ";" +
                telefone + ";" + telemovel + ";" + morada + ";" + grupo_sanguineo + ";" + codigo_postal + ";";
    }
    // Atributos
    protected int id_pessoa;
    protected String nome;
    protected char sexo;
    protected int bi;
    protected Date data_de_nascimento;
    protected int nif;
    protected String email;
    protected int telefone;
    protected int telemovel;
    protected String morada;
    protected String grupo_sanguineo;
    protected CodigoPostal codigo_postal;
}
